/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.lista05;

import java.util.Scanner;

/**
 *
 * @author mendel
 */
public class Agenda implements Repositorio
{
    Scanner s = new Scanner(System.in);
    Tarefa[] tarefas;
    
    public void trataQtdTarefas(int qtdTarefas){
         tarefas = new Tarefa[qtdTarefas];
    }
    @Override
    public boolean cadastrarTarefa(int opcaoTipoTarefa, int opcaoTarefa) 
           throws LotadoException, ImportanciaException
    {
        if(tarefas[tarefas.length - 1] != null)
        {
            throw new LotadoException();
        }
        else
        {
            if (opcaoTipoTarefa == 1 || opcaoTipoTarefa == 2) 
            {
                if (opcaoTarefa == 1) 
                {
                    int wCodigo = s.nextInt();
                    String wDescricao = s.next();
                    String wData = s.next();
                    int wDuracao = s.nextInt();
                    String wLocal = s.next();
                    for (int y = 0; y < tarefas.length; y++) 
                    {
                        if (tarefas[y] == null) 
                        {
                            if (opcaoTipoTarefa == 1) 
                            {
                                tarefas[y] = new TarefaGerencial(wCodigo, wDescricao, wData, wDuracao, wLocal);
                                return true;
                            } 
                            else 
                            {
                                tarefas[y] = new TarefaDesenvolvimento(wCodigo, wDescricao, wData, wDuracao, wLocal);
                                return true;
                            }
                        }
                    }
                } 
                else if (opcaoTarefa == 2) 
                {
                    int wCodigo = s.nextInt();
                    String wDescricao = s.next();
                    String wData = s.next();
                    int wDuracao = s.nextInt();
                    String wLocal = s.next();
                    int wImportancia = 0;
                    while (true) 
                    {
                        wImportancia = s.nextInt();
                        if (wImportancia < 1 || wImportancia > 5) 
                        {
                            throw new ImportanciaException();
                        } 
                        else 
                        {
                            break;
                        }
                    }
                    int wUrgencia = 0;
                    while (true) 
                    {
                        wUrgencia = s.nextInt();
                        if (wUrgencia < 1 || wUrgencia > 5) 
                        {
                            throw new ImportanciaException();
                        } 
                        else 
                        {
                            break;
                        }
                    }
                    double wValorHora = s.nextDouble();
                    for (int y = 0; y < tarefas.length; y++) 
                    {
                        if (tarefas[y] == null) 
                        {
                            if (opcaoTipoTarefa == 1)
                            {
                                tarefas[y] = new TarefaGerencial(wCodigo, wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora);
                                return true;
                            } else {
                                tarefas[y] = new TarefaDesenvolvimento(wCodigo, wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora);
                                return true;
                            }
                        }
                    }
                }
                return false;
            } 
            else 
            {
                if (opcaoTarefa == 1) 
                {
                    String wDescricao = s.next();
                    String wData = s.next();
                    int wDuracao = s.nextInt();
                    String wLocal = s.next();
                    for (int y = 0; y < tarefas.length; y++) 
                    {
                        if (tarefas[y] == null) 
                        {
                            tarefas[y] = new TarefaDesenvolvimentoAuto(wDescricao, wData, wDuracao, wLocal);
                            return true;
                        }
                    }
                } 
                else if (opcaoTarefa == 2) 
                {
                    String wDescricao = s.next();
                    String wData = s.next();
                    int wDuracao = s.nextInt();
                    String wLocal = s.next();
                    int wImportancia = 0;
                    while (true) 
                    {
                        wImportancia = s.nextInt();
                        if (wImportancia < 1 || wImportancia > 5) {
                            throw new ImportanciaException();
                        } 
                        else 
                        {
                            break;
                        }
                    }
                    int wUrgencia = 0;
                    while (true) 
                    {
                        wUrgencia = s.nextInt();
                        if (wUrgencia < 1 || wUrgencia > 5) 
                        {
                            throw new ImportanciaException();
                        } 
                        else 
                        {
                            break;
                        }
                    }
                    double wValorHora = s.nextDouble();
                    for (int y = 0; y < tarefas.length; y++) 
                    {
                        if (tarefas[y] == null) 
                        {
                            tarefas[y] = new TarefaDesenvolvimentoAuto(wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora);
                            return true;
                        }
                    }
                }
                return false;
            }
        }
    }
    @Override
    public boolean removerTarefa(int codTarefa) throws SemTarefaException
    {
        if(tarefas.length == 0)
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int i = 0; i < tarefas.length; i++) 
            {             
                if (tarefas[i].getCodigo() == codTarefa) 
                {
                    if (tarefas[tarefas.length - 1] != null) 
                    {
                        tarefas[i] = tarefas[tarefas.length - 1];
                        tarefas[tarefas.length - 1] = null;
                        return true;
                    } 
                    else 
                    {
                        for (int y = 0; y < tarefas.length; y++) 
                        {
                            if (tarefas[y] == null) 
                            {
                                if (i == y - 1) 
                                {
                                    tarefas[y - 1] = null;
                                    return true;
                                } 
                                else 
                                {
                                    tarefas[i] = tarefas[y - 1];
                                    tarefas[y - 1] = null;
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
    @Override
    public TarefaTO consultarTarefa(int codigo) throws SemTarefaException
    {
        TarefaTO tarefaAux = null;
        if(tarefas.length == 0)
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int i = 0; i < tarefas.length; i++) 
            {
                if (tarefas[i] != null) 
                {
                    if (tarefas[i].getCodigo() == codigo) 
                    {
                        tarefaAux = new TarefaTO(tarefas[i].getCodigo(), tarefas[i].getDescricao(),
                                tarefas[i].getData(), tarefas[i].getDuracao(), tarefas[i].getLocal(),
                                tarefas[i].getImportancia(), tarefas[i].getUrgencia(),
                                tarefas[i].getValorHora());
                        tarefaAux.setValorCobrado(tarefas[i].getValorCobrado());
                        tarefaAux.setStatus(tarefas[i].getStatus());
                        return tarefaAux;
                    } 
                    else 
                    {
                        continue;
                    }
                }
            }
            return tarefaAux;
        }  
    }
    @Override
    public TarefaTO[] listarTarefa()
    {
        TarefaTO[] arrayAux = null;
        arrayAux = (TarefaTO[]) tarefas;
        if(arrayAux.length != 0)
        {
            return arrayAux;
        }
        else
        {
            arrayAux = null;
            return arrayAux;
        }
    }
    @Override
    public boolean iniciarTarefa(int codigo) throws SemTarefaException
    {
        if(tarefas.length == 0)
        {
            throw new SemTarefaException();
        }
        else
        {
            for(int y = 0; y < tarefas.length; y++)
            {
                if(tarefas[y] != null)
                {
                    if(tarefas[y].getCodigo() != codigo)
                    {
                        continue;
                    }
                    else
                    {
                        tarefas[y].iniciarTarefa();
                        return true;
                    }
                }
            }
            return false;
        }  
    }
    @Override
    public boolean encerrarTarefa(int codigo, double wValorCobrado) throws SemTarefaException
    {
        if(tarefas.length == 0)
        {
            throw new SemTarefaException();
        }
        else
        {
            for(int y = 0; y < tarefas.length; y++)
            {
                if(tarefas[y] != null)
                {
                    if(tarefas[y].getCodigo() != codigo)
                    {
                        continue;
                    }
                    else 
                    {
                        tarefas[y].encerrarTarefa(wValorCobrado);
                        return true;
                    }
                }
            }
            return false;
        }  
    }
    @Override
    public boolean alterarImportancia(int codigo, int wOpcao) throws SemTarefaException
    {
        if(tarefas.length == 0)
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.length; y++) 
            {
                if (tarefas[y] != null) 
                {
                    if (tarefas[y].getCodigo() != codigo) 
                    {
                        continue;
                    } 
                    else 
                    {
                        if (wOpcao == 1) 
                        {
                            tarefas[y].incrementaImportancia();
                            return true;
                        } 
                        else if (wOpcao == 2) 
                        {
                            tarefas[y].decrementaImportancia();
                            return true;
                        }
                    }
                }
            }
            return false;
        } 
    }
    @Override
    public boolean cancelarTarefa(int codigo) throws SemTarefaException
    {
        if(tarefas.length == 0)
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.length; y++) 
            {
                if (tarefas[y] != null) 
                {
                    if (tarefas[y].getCodigo() != codigo) 
                    {
                        continue;
                    } 
                    else 
                    {
                        tarefas[y].cancelarTarefa();
                        return true;
                    }
                }
            }
            return false;
        }
        
    }
    public boolean reiniciarTarefa(int codigo) throws SemMetodoException, SemTarefaException
    {
        TarefaDesenvolvimento tarefaDesenv;
        if(tarefas.length == 0)
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.length; y++) 
            {
                if (tarefas[y] != null) 
                {
                    if (tarefas[y].getCodigo() != codigo) 
                    {
                        continue;
                    } 
                    else 
                    {
                        if (tarefas[y] instanceof TarefaDesenvolvimento) 
                        {
                            tarefaDesenv = (TarefaDesenvolvimento) tarefas[y];
                            tarefaDesenv.reiniciarTarefa();
                            System.out.println("A tarefa foi cancelada com sucesso.");
                            return true;
                        } 
                        else 
                        {
                            throw new SemMetodoException();
                        }
                    }
                }
            }
            return false;
        }
        
    }
}
